const { hexMD5: md5 } = require("./md5");

// const response = {
//   nonce_str: "hpCO2Z4PGCOx0YJT",
//   appid: "wxcd94e60915a6c2c1",
//   sign: "F313E1FC5196647C137C225896D493C9",
//   trade_type: "APP",
//   // 微信的key
//   wx_key: "shbjxnjq201705021323146616302111",
//   return_msg: "OK",
//   result_code: "SUCCESS",
//   mch_id: "1466161302",
//   return_code: "SUCCESS",
//   prepay_id: "wx17143234238716b1ff2b5586608e520000"
// };

// console.log(getPayInfo(response));
/*
 * 生成订单信息
 * @params orderInfo: any 后端返回的数据，格式和上面一样
 */
function getPayInfo(orderInfo) {
  // 统一下单返回数据
  let res;
  if (typeof orderInfo === "string") {
    res = JSON.parse(orderInfo);
  } else {
    res = orderInfo;
  }
  console.log("生成微信支持参数，传来的数据:");
  console.log(res);

  let time = new Date();
  let timestamp = time.getTime().toString().substr(0, 10); // 时间戳
  let noncestr = randomSrt(true, 10, 20); // 随机数
  let key = res.wx_key; // 加密Key，微信支付填写的key
  let payInfo = {
    appid: res.appid,
    noncestr,
    package: "Sign=WXPay",
    partnerid: res["mch_id"],
    prepayid: res["prepay_id"],
    timestamp: Number(timestamp)
  };
  // 键值对按照ASCII码从小到大排序生成类似：appid=xxx&body=xx&device_info=1000
  let keyValueStr = mapObjToKeyValue(payInfo, true);
  // 插入加密Key到最后
  let strSignTemp = `${keyValueStr}&key=${key}`;
  // 真正的二次加密
  let sign = md5(strSignTemp).toUpperCase().substr(0, 32);
  console.log("--- 去微信支付文档做校验的字符串 ---");
  console.log(`key:${key}`);
  console.log(sign); // 可以去微信支付文档做校验
  console.log("--- 去微信支付文档做校验的字符串 ---");
  payInfo.sign = sign;
  // 返回字符串给uniapp调起支付用
  return JSON.stringify(payInfo);
}
/*
 * 生成指定的随机字符串
 * @params isRandomLength: boolean 是否在min ~ max生成随机长度
 * @params min: number 最小长度
 * @params max: number 最大长度
 */
function randomSrt(isRandomLength, min, max) {
  let str = "",
    range = min;
  const arr = [
    "0",
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",
    "7",
    "8",
    "9",
    "a",
    "b",
    "c",
    "d",
    "e",
    "f",
    "g",
    "h",
    "i",
    "j",
    "k",
    "l",
    "m",
    "n",
    "o",
    "p",
    "q",
    "r",
    "s",
    "t",
    "u",
    "v",
    "w",
    "x",
    "y",
    "z",
    "A",
    "B",
    "C",
    "D",
    "E",
    "F",
    "G",
    "H",
    "I",
    "J",
    "K",
    "L",
    "M",
    "N",
    "O",
    "P",
    "Q",
    "R",
    "S",
    "T",
    "U",
    "V",
    "W",
    "X",
    "Y",
    "Z"
  ];

  // 随机产生
  if (isRandomLength) {
    range = Math.round(Math.random() * (max - min)) + min;
  }
  for (var i = 0; i < range; i++) {
    let pos = Math.round(Math.random() * (arr.length - 1));
    str += arr[pos];
  }
  return str;
}

/*
 * 根据object生成key value字符串
 * @params obj: any 要map的对象
 * @params isSort: boolean 是否根据ASCII字典排序
 */
function mapObjToKeyValue(obj, isSort = false) {
  let keys = Object.keys(obj);
  let str = "";

  if (isSort) keys.sort();
  keys.forEach((key) => {
    if (obj.hasOwnProperty(key)) {
      str += `${key}=${obj[key]}&`;
    }
  });
  return str.replace(/&$/, "");
}

module.exports = {
  getPayInfo
};
